//!函数
/*函数*/
pub fn sum(x: i32, y: i32)->i32{
    // return x + y;
    x + y //最后一个表达式的值，默认作为返回值
}
#[test]
pub fn fun_demo(){
    let x = sum(1, 3);
    println!("{}", x);
}
//在rust中，函数是一等公民（可以储存在变量/数据结构中，可以作为参数传入函数，可以作为返回值），
// 所以rust的函数参数不仅可以是一般的类型，也可以是函数

fn say_what(name: &str, func: fn(&str)){
    func(name);
}

fn hello(str: &str){
    println!("{}", str);
}
#[test]
pub fn fun_demo2(){
    //函数作为参数
    say_what("Peter", hello);
    //闭包（匿名函数）
    say_what("Tom", |str|{
        println!("{}", str)
    });
}

//return关键字, rust也有return关键字，不过一般用于提前返回。来看一个简单地例子：

//接受一个i32类型n和一个i32类型的切片(slice)a，返回一个bool值，
fn find(n: i32, a: &[i32]) -> bool {
    for i in a {
        if *i == n {
            return true;
        }
    }
     false
}
#[test]
pub fn fun_demo3(){

    let a = [1, 3, 5, 7];
    println!("{}", find(3, &a[2..]));
}

//返回多个值,rust的函数不支持多返回值，但是我们可以利用元组来返回多个值，

fn pow_2_3(n: i32) -> (i32, i32) {
    (n * n, n * n *n)
}

#[test]
pub fn fun_demo4(){
    let (i, j) = pow_2_3(2);
    println!("{}, {}", i, j);
}
//发散函数，是rust中的一个特性。发散函数不返回，它使用感叹号!作为返回类型表示：
// 发散函数一般都以panic!宏调用或其他调用其他发散函数结束，所以，调用发散函数会导致当前线程崩溃
fn diverging() -> ! {
    panic!("diverging");
}

#[test]
pub fn fun_demo5(){
    println!("hello");
    diverging();
    //println!("world");
}